package uri.model.board;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import uri.model.BoardVO;
import uri.model.CommentVO;
import uri.model.FileVO;

@Service
public class PublicServiceImpl implements PublicService {
	@Resource(name="publicDAOImpl")
	private PublicDAO publicDAO;

	@Override
	public void boardWrite(BoardVO bvo) {
		publicDAO.boardWrite(bvo);
	}

	@Override
	public void fileUpload(FileVO fvo) {
		publicDAO.fileUpload(fvo);
	}
	/**
	 * 박현종 6-18 15:16
	 * no에 해당하는 게시물의 상세정보를 가져오는 메서드
	 */
	public BoardVO detailBoard(String no){
		return publicDAO.detailBoard(no);
	}
	/**
	 * 박현종 6-23 17:04
	 * no에 해당하는 게시물의 조회수 증가
	 */
	public void hitUp(String no){
		publicDAO.hitUp(no);
	}
	/**
	 * 박현종 6-24 10:16
	 * no에 해당하는 게시물의 모든 댓글 조회
	 */
	public ArrayList<CommentVO> getAllComment(String no){
		return (ArrayList<CommentVO>) publicDAO.getAllComment(no);
	}
	/**
	 * 박현종 6-24 11:45
	 * 댓글 등록하는 메서드
	 */
	public int writeComment(CommentVO cvo){
		return publicDAO.writeComment(cvo);
	}
	/**
	 * 박현종 6-24 16:27
	 * 댓글 삭제하는 메서드
	 */
	public int deleteComment(String no){
		return publicDAO.deleteComment(no);
	}
	/**
	 * 박현종 6-26 10:55
	 * 현재페이지에 해당하는 게시글 리스트를 조회하는 메서드
	 * 현제페이지가 null이면 첫페이지 게시글을 반환
	 */
	public PublicListVO getPublicBoardList(String nowPage){
		PublicListVO plvo = null;
		PublicBoardPagingBean bean = null;
		ArrayList<BoardVO> list = null;
		int totalContents = publicDAO.publicboardTotalCount(); // 전체 게시글수를
																 // 반환
		if (nowPage == null) {// 현재 페이지가 null이면
			// 리스트에 1번째 페이지의 게시글을 넣고
			list =  (ArrayList<BoardVO>) publicDAO.getPublicBoardListNullPage(); 
			bean = new PublicBoardPagingBean(totalContents); // bean 객체를 생성한다.
		} else {// 현재 페이지가 null이 아니면		
			// 현재페이지에 해당하는 게시물 조회
			list =  (ArrayList<BoardVO>) publicDAO.getPublicBoardListNowPage(nowPage);
			bean = new PublicBoardPagingBean(totalContents,Integer.parseInt(nowPage)); // bean 객체를 생성한다.
		}
		plvo = new PublicListVO(list,bean); // list와 bean객체를 넣어 vo객체를 생성한다.

		return plvo; // plvo 객체 반환
	}
	/**
	 * 박현종 6-26 14:50
	 * no에 해당하는 게시물의 모든 파일을 삭제
	 */
	public void deleteFileNameByPubNo(String no,String path){
		//no에 해당하는 모든 newFileName을 반환
		List<String> list = publicDAO.findFileNameByPubNo(no);
		for(int i=0;i<list.size();i++){
			File mFile = new File(path+list.get(i)); //파일 객체를 만들고
			boolean flag =  mFile.delete(); //실제 파일을 삭제 
			if(flag)
			System.out.println(mFile.getName()+" 삭제완료");
		}
	}
	/**
	 * 박현종 6-26 15:15
	 * no에 해당하는 게시물 삭제
	 */
	public void deleteBoardByPubNo(String no){
		publicDAO.deleteBoardByPubNo(no);
	}
	/**
	 * 박현종 6-26 17:17
	 * no에 해당하는 org파일이름과 new파일이름을 조회
	 */
	public List<HashMap> findOrgAndNewFileListByPubNo(String no){
		return publicDAO.findOrgAndNewFileListByPubNo(no);
	}
	/**
	 * 박현종 6-27 15:00
	 *  no에 해당하는 comment의 content값을 업데이트
	 */
	public int updateComment(HashMap map){
		return publicDAO.updateComment(map);
	}
	/**
	 * 박현종 6-30 10:08
	 * 답글달기 페이지에 표시하기 위해
	 * no에 해당하는 게시글 정보를 조회
	 */
	public BoardVO replyBoardWriteInfo(String no){
		BoardVO bvo  = publicDAO.replyBoardWriteInfo(no);
		//답글이기 때문에 제목에 Re: 를 붙여본다
		bvo.setTitle("Re: "+bvo.getTitle()); 
		
		return bvo;
	}
	/**
	 * 박현종 6-30 10:58
	 * 답글등록
	 */
	public void replyBoardWrite(BoardVO bvo){
		bvo.setRelevel(bvo.getRelevel()+1);
		bvo.setRestep(bvo.getRestep()+1);
		publicDAO.replyBoardWrite(bvo);
	}
	/**
	 * 박현종 6-30 14:41
	 * 제목에 word가 포함된 
	 * 게시물을 반환하는 메서드 (페이징처리) 
	 */
	public PublicListVO searchPublicBoardListByTitle(HashMap map){
		PublicListVO plvo = null;
		PublicBoardPagingBean bean = null;
		ArrayList<BoardVO> list = null;
		String nowPage = (String) map.get("nowPage");
		String word = (String) map.get("word");
		int totalContents = publicDAO.findTitleCount(word); // 검색한 게시글 수를 반환
		if (nowPage == null) {// 현재 페이지가 null이면
			// 리스트에 1번째 페이지의 게시글을 넣고
			list =  (ArrayList<BoardVO>) publicDAO.searchPublicBoardListByTitleNullPage(map);
			bean = new PublicBoardPagingBean(totalContents); // bean 객체를 생성한다.
		} else {// 현재 페이지가 null이 아니면		
			// 현재페이지에 해당하는 게시물 조회
			list =  (ArrayList<BoardVO>) publicDAO.searchPublicBoardListByTitleNowPage(map);
			bean = new PublicBoardPagingBean(totalContents,Integer.parseInt(nowPage)); // bean 객체를 생성한다.
		}
		plvo = new PublicListVO(list,bean); // list와 bean객체를 넣어 vo객체를 생성한다.

		return plvo; // plvo 객체 반환
	}
	/**
	 * 박현종 6-30 16:13
	 * 내용에 word가 포함된 
	 * 게시물을 반환하는 메서드 (페이징처리) 
	 */
	public PublicListVO searchPublicBoardListByContent(HashMap map){
		PublicListVO plvo = null;
		PublicBoardPagingBean bean = null;
		ArrayList<BoardVO> list = null;
		String nowPage = (String) map.get("nowPage");
		String word = (String) map.get("word");
		int totalContents = publicDAO.findContentCount(word); // 검색한 게시글 수를 반환
		if (nowPage == null) {// 현재 페이지가 null이면
			// 리스트에 1번째 페이지의 게시글을 넣고
			list =  (ArrayList<BoardVO>) publicDAO.searchPublicBoardListByContentNullPage(map);
			bean = new PublicBoardPagingBean(totalContents); // bean 객체를 생성한다.
		} else {// 현재 페이지가 null이 아니면		
			// 현재페이지에 해당하는 게시물 조회
			list =  (ArrayList<BoardVO>) publicDAO.searchPublicBoardListByContentNowPage(map);
			bean = new PublicBoardPagingBean(totalContents,Integer.parseInt(nowPage)); // bean 객체를 생성한다.
		}
		plvo = new PublicListVO(list,bean); // list와 bean객체를 넣어 vo객체를 생성한다.

		return plvo; // plvo 객체 반환
	}
	
	/**
	 * 박현종 6-30 16:34
	 * 제목이나 내용에 word가 포함된 
	 * 게시물을 반환하는 메서드 (페이징처리) 
	 */
	public PublicListVO searchPublicBoardListByTitleAndContent(HashMap map){
		PublicListVO plvo = null;
		PublicBoardPagingBean bean = null;
		ArrayList<BoardVO> list = null;
		String nowPage = (String) map.get("nowPage");
		String word = (String) map.get("word");
		int totalContents = publicDAO.findTitleAndContentCount(word); // 검색한 게시글 수를 반환
		if (nowPage == null) {// 현재 페이지가 null이면
			// 리스트에 1번째 페이지의 게시글을 넣고
			list =  (ArrayList<BoardVO>) publicDAO.searchPublicBoardListByTitleAndContentNullPage(map);
			bean = new PublicBoardPagingBean(totalContents); // bean 객체를 생성한다.
		} else {// 현재 페이지가 null이 아니면		
			// 현재페이지에 해당하는 게시물 조회
			list =  (ArrayList<BoardVO>) publicDAO.searchPublicBoardListByTitleAndContentNowPage(map);
			bean = new PublicBoardPagingBean(totalContents,Integer.parseInt(nowPage)); // bean 객체를 생성한다.
		}
		plvo = new PublicListVO(list,bean); // list와 bean객체를 넣어 vo객체를 생성한다.
		return plvo; // plvo 객체 반환
	}
	/**
	 * 박현종 7-01	10:58
	 * 게시글 수정페이지에 표현될 내용을 가져온다
	 */
	public BoardVO updatePublicBoardInfo(String no){
		return publicDAO.updatePublicBoardInfo(no);
	}
	/**
	 * 박현종 7-01 16:38
	 * fileNo에 해당하는 파일 DB에서 삭제
	 */
	public void deleteFileByFileNo(String fileNo){
		publicDAO.deleteFileByFileNo(fileNo);
		System.out.println(fileNo+"번 파일 DB에서 삭제");
	}
	/**
	 * 박현종 7-01 16:58
	 * no에 해당하는 게시물 수정
	 */
	public void updatePublicBoard(BoardVO bvo){
		publicDAO.updatePublicBoard(bvo);
	}
	/**
	 * 박현종 7-11 13:57
	 * no에 해당하는 게시글 추천
	 */
	public void updateLike(String no){
		publicDAO.updateLike(no);
	}
}//class
